package chatModel;

import java.net.InetAddress;
import java.util.Observable;

import javax.swing.DefaultListModel;

import messages.MessageCreationException;
import messages.MessagesFactory;

/**
 * Classe décrivant une notification destinée au GUI
 * Elle est observable et envoie des notifications pour les messages au GUI
 * @author vincent
 */
public class ModelMsgToGUI extends Observable {
	
	private Utilisateur utilisateurLocal;
	/*private String userName;
	private InetAddress myIp;*/
	
	private int choix;
	private DefaultListModel listeUser = new DefaultListModel();
	private String msgDansFenetre;
	private String nameFileProposed;
	private UtilisateurDistant userDistant;
        
        /**
         * Constructeur
         * @param utilisateurLocal : L'utilisateur local
         */
	public ModelMsgToGUI(Utilisateur utilisateurLocal) {
		super();
		this.utilisateurLocal=utilisateurLocal;
	}
        
        /**
         * Donne l'utilisateur local
         * @return Utilisateur : l'utilisateur local
         */
	public Utilisateur getUtilisateurLocal() {
		return utilisateurLocal;
	}
	
        /**
         * Change ou initialise l'utilisateur local
         * @param utilisateurLocal : Utilisateur local
         */
	public void setUtilisateurLocal(Utilisateur utilisateurLocal) {
		this.utilisateurLocal = utilisateurLocal;
	}

	/*public void setUserName(String userName) {
		this.userName = userName;
	}

	public InetAddress getMyIp() {
		return myIp;
	}

	public void setMyIp(InetAddress myIp) {
		this.myIp = myIp;
	}
*/
        /**
         * Donne la valeur du choix pour savoir le type de notification
         * @see chatModel.Choix Choix
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @return 
         */
	public int getChoix() {
		return choix;
	}
        
        /**
         * Change la valeur du choix (change le type de notification)
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @param choix : valeur du choix
         */
	public void setChoix(int choix) {
		this.choix = choix;
	}
        
        
	public DefaultListModel getListeUser() {
		return listeUser;
	}

	public void setListeUser(DefaultListModel listeUser) {
		this.listeUser = listeUser;
	}
        
        /**
         * Donne le message qui va s'affiche dans la fenêtre du GUI
         * @return 
         */
	public String getMsgDansFenetre() {
		return msgDansFenetre;
	}

        /**
         * Change le message destiné à la fenêtre du GUI
         * @param msgDansFenetre Message pour la fenêtre
         */
	public void setMsgDansFenetre(String msgDansFenetre) {
		this.msgDansFenetre = msgDansFenetre;
	}

        /**
         * Donne le nom du fichier proposé
         * @return Nom du fichier
         */
	public String getNameFileProposed() {
		return nameFileProposed;
	}

        /**
         * Change le nom du fichier proposé
         * @param nameFileProposed Nom du fichier proposé
         */
	public void setNameFileProposed(String nameFileProposed) {
		this.nameFileProposed = nameFileProposed;
	}

        /**
         * Donne l'utilisateur distant
         * @return UtilisateurDistant : l'utilisateur distant qui a émit un message ou une proposition de fichier
         */
	public UtilisateurDistant getUserDistant() {
		return userDistant;
	}

        /**
         * Change l'utilisateur distant
         * @param userDistant : Utilisateur distant
         */
	public void setUserDistant(UtilisateurDistant userDistant) {
		this.userDistant = userDistant;
	}
	
        /**
         * Notification : notifie que l'utilisateur local passe à l'état connecté
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#connexionOk connexionOK
         */
	public void connect(){
		this.choix=Choix.connexionOk;
		System.out.println("model gui connecté");
		this.setChanged();
		this.notifyObservers(this);
	}
	
        /**
         * Notification : notifie que l'utilisateur passe à l'état déconnecté
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#deconnexionOk deconnexionOk
         */
	public void disconnect(){
		this.choix=Choix.deconnexionOk;
		this.listeUser.clear();
		this.setChanged();
		this.notifyObservers(this);
	}
	
        /**
         * Notification : notifie l'envoi d'un nouveau message par l'utilisateur local
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#afficherMsg afficherMsg
         * @param user Utilisateur destinataire
         * @param msg Message à envoyer
         */
	public void afficherMsgToSend(UtilisateurDistant user, String msg){
		this.userDistant=user;
		this.msgDansFenetre= this.utilisateurLocal.getUserName() + " : " + msg;
		this.choix = Choix.afficherMsg;
		
		this.setChanged();
		super.notifyObservers(this);
	}
	
        /**
         * Notification pour afficher les déconnexions et connexions
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#connectdeconnect connectdeconnect
         * @param user Utilisateur distant concerné
         * @param msg Message qui indique si on se connecte ou non
         */
	public void afficheConnectDeconnect(UtilisateurDistant user, String msg){
		this.userDistant=user;
		this.msgDansFenetre = msg;
		this.choix=Choix.connectdeconnect;
		this.setChanged();
		this.notifyObservers(this);
	}
        
        /**
         * Notification pour afficher l'état des transferts de fichier
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#fichierRecuOuEnvoye fichierRecuOuEnvoye
         * @param user Utilisateur distant emmeteur ou recepteur
         * @param msg Message indiquant si l'état du transfert
         */
	public void fichierEnvoyeOuRecu(UtilisateurDistant user, String msg){
		this.userDistant=user;
		this.msgDansFenetre=msg;
		this.choix = Choix.fichierRecuOuEnvoye;
		
		this.setChanged();
		this.notifyObservers(this);
	}
	
        /**
         * Notifie qu'un nouveau message d'un utilisateur distant est arrivé
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#rcvMsg rcvMsg
         * @param distantUser Utilisateur distant emmetteur
         * @param newMsg Nouveau message reçu
         */
	public void notifyGUINewMsg(UtilisateurDistant distantUser, String newMsg) {
		this.userDistant=distantUser;
		this.msgDansFenetre=newMsg;
		this.choix=Choix.rcvMsg;
		this.setChanged();
		this.notifyObservers(this);
	}
        
        /**
         * Notifie que l'utilisateur distant accepte le fichier proposé par l'utilisateur local
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#rcvAcceptedFile rcvAcceptedFile
         * @param user Utilisateur qui a répondu à la proposition
         * @param nameFile Nom du fichier concerné
         */
	public void notifyGUISendFile(UtilisateurDistant user, String nameFile){
		this.userDistant=user;
		this.msgDansFenetre=user.getUserName() + " a accepté de recevoir votre fichier " + nameFile;
		this.choix=Choix.rcvAcceptedFile;
		System.out.println("je vais dire au gui qu'il accepte le fichier");
		this.setChanged();
		super.notifyObservers(this);
	}
	
	/**
         * Notifie que le fichier proposé par lu'ilisateur local a été refusé
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#rcvRefusedFile rcvRefusedFile
         * @param userUtilisateur distant qui a refusé le fichier
         * @param nameFile Nom du fichier refusé
         */
        public void notifyGUIFileRefused(UtilisateurDistant user, String nameFile){
		this.userDistant=user;
		this.msgDansFenetre=user.getUserName() + " a refusé de recevoir votre fichier " + nameFile;
		this.choix=Choix.rcvRefusedFile;
		this.setChanged();
		super.notifyObservers(this);
	}

        /**
         * Notifie qu'un utilisateur distant propose un fichier
         * @see chatGUI.ChatGUI#update(java.util.Observable, java.lang.Object) update
         * @see chatModel.Choix#fileNotif fileNotif
         * @param distantUser Utilisateur distant qui propose le fichier
         * @param nameFile Nom du fichier proposé
         */
	public void notifyGUIFileRequest(UtilisateurDistant distantUser, String nameFile) {
		this.userDistant=distantUser;
		this.nameFileProposed = nameFile;
		this.choix=Choix.fileNotif;
		this.setChanged();
		this.notifyObservers(this);
	}
	
        
}
